package com.HeJing.成员变量与局部变量的对比练习;

/**
 * ClassName: Main
 * Package: com.HeJing.成员变量与局部变量的对比练习
 * Description:
 *
 * @Author: HeJing
 * @Create: 2023-03-20 8:58
 * @Version: 1.0
 */
public class Main {
    public static void main(String[] args){

        /*
        *   1、类的成员之一: 属性
        *       -> 1.1、变量的分类:
        *           -> 角度1: 按照数据类型来分: 基本数据类型、引用数据类型
        *           -> 角度2: 按照变量在类中声明的位置的不同: 成员变量(或属性)、局部变量
        *
        *   2、区分成员变量和局部变量:
        *       -> 2.1、相同点:
        *           -> 变量声明的格式相同: 数据类型 变量名 = 变量值
        *           -> 变量都有其有效的作用域，出了作用域就失效了。
        *           -> 变量必须先声明、后赋值、再使用
        *
        *       -> 2.2、不同点:
        *           -> 类中声明的位置不同:
        *               -> 属性: 声明在类内、方法外
        *               -> 局部变量: 声明在方法、构造器内
        *
        *           -> 在内存中分配的位置不同:
        *               -> 属性: 随着对象的创建，储存在堆空间中
        *               -> 局部变量: 储存在栈空间中
        *
        *           -> 生命周期不同:
        *               -> 属性: 随着对象的创建而创建，随着对象的消亡而消亡。
        *               -> 局部变量: 随着方法的栈帧入栈，局部变量会在栈中分配，随着方法对应的栈帧出栈，局部变量消亡。
        *
        *           -> 作用域不同:
        *               -> 属性: 在整个类的内部都是有效的。
        *               -> 局部变量: 仅限于声明此局部变量所在的方法(或构造器、代码块)中。
        *
        *           -> 是否可以有权限修饰符（public、ptotected、private、缺省）进行修饰:
        *               -> 属性: 可以使用权限修饰符进行修饰
        *               -> 局部变量: 不能使用权限修饰符进行修饰。
        *
        *           -> 是否有默认值:
        *               -> 属性: 都有默认初始化值，意味着如果没有给属性进行线性初始化赋值，也会有哦默认初始化值
        *               -> 局部变量: 都没有默认初始化值，意味着在使用局部变量之前必须显式赋值，否则会报错。
        * */

        Person p1 = new Person();
        System.out.println(p1.name);  // null
    }
}
























